package com.itcam.interview.pro00.thread;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author : Cammy.Wu
 * Description : 
 */

public class CyclicBarrierExample {
    public static void main(String[] args) {
//        Example1();
        CyclicBarrier barrier = new CyclicBarrier(3);
        for (int i = 0; i < 3; i++) {
            final int carNumber = i;
            Thread thread = new Thread(() -> {
                try {
                    System.out.println("赛车 " + carNumber + " 正在准备...");
                    Thread.sleep((long) (Math.random() * 3000));
                    System.out.println("赛车 " + carNumber + " 准备就绪，等待其他赛车...");

                    // 等待其他赛车准备好
                    barrier.await();
                    System.out.println("赛车 " + carNumber + " 起跑！");
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });
            thread.start();
        }
    }

    private static void Example1() {
        // 创建CyclicBarrier，指定 parties 为3，并设置 barrierAction
        CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("所有线程到达屏障点，一起继续执行"));

        Thread thread1 = new Thread(() -> {
            try {
                // 模拟任务执行
                Thread.sleep(2000);
                System.out.println("线程1完成第一部分任务，等待其他线程");
                // 到达屏障点
                barrier.await();
                // 继续执行后续任务
                System.out.println("线程1开始执行第二部分任务");
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                // 模拟任务执行
                Thread.sleep(3000);
                System.out.println("线程2完成第一部分任务，等待其他线程");
                // 到达屏障点
                barrier.await();
                // 继续执行后续任务
                System.out.println("线程2开始执行第二部分任务");
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        });

        Thread thread3 = new Thread(() -> {
            try {
                // 模拟任务执行
                Thread.sleep(1000);
                System.out.println("线程3完成第一部分任务，等待其他线程");
                // 到达屏障点
                barrier.await();
                // 继续执行后续任务
                System.out.println("线程3开始执行第二部分任务");
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        });
        Thread thread4 = new Thread(() -> {
            try {
                // 模拟任务执行
                Thread.sleep(1000);
                System.out.println("线程4完成第一部分任务，等待其他线程");
                // 到达屏障点
                barrier.await();
                // 继续执行后续任务
                System.out.println("线程4开始执行第二部分任务");
            } catch (InterruptedException | BrokenBarrierException e) {
                e.printStackTrace();
            }
        });
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();

        try {
            // 等待所有线程执行完毕
            thread1.join();
            thread2.join();
            thread3.join();
            thread4.join();
        } catch (InterruptedException e) {
            System.err.println("主线程等待过程中被中断: " + e.getMessage());
        }
    }
}
